package com.kotlin.myapplication.mvp.ui.main.fragment

import android.os.Build
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.webkit.WebSettings
import android.webkit.WebViewClient
import com.kotlin.myapplication.R
import com.kotlin.myapplication.base.BaseFragment

/**
 *@lil
 *@创建时间 2019/11/6 15:17
 *@描述
 */
import kotlinx.android.synthetic.main.fragment_web.*
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.webkit.ValueCallback
import android.annotation.SuppressLint
import android.webkit.PermissionRequest
import android.annotation.TargetApi
import android.net.Uri
import android.webkit.JsResult
import android.webkit.JsPromptResult
import com.kotlin.myapplication.utils.Logger
import android.net.http.SslError
import android.webkit.SslErrorHandler
import com.kotlin.myapplication.mvp.ui.main.MainfirstActivity


class ShopFragment : BaseFragment() {

    override fun getView(inflater: LayoutInflater, parent: ViewGroup): View {
        return inflater.inflate(R.layout.fragment_web, parent, false)
    }

    override fun initView(view: View) {
        val urls = "file:///android_asset/html/logindemo.html"
        initWebView(urls)
        //关闭按钮
        title_view.setLeftThirdViewContent(getResources().getString(R.string.title_bar_view_close), getResources().getColor(R.color.white))
        title_view.setLeftThirdViewOnClickListener(View.OnClickListener {
            if (null != activity) {
                if (activity is MainfirstActivity) {
                    (activity as MainfirstActivity).turnToDevicesFragment()
                }
            }
        })
        //返回按钮
        title_view.setLeftViewContont(getResources().getString(R.string.title_bar_view_back))
        title_view.setLeftViewTextColor(getResources().getColor(R.color.white))
        title_view.setLeftViewOnClickListener(View.OnClickListener {
            if (null != activity) {
                if (activity is MainfirstActivity) {
                    (activity as MainfirstActivity).turnToDevicesFragment()
                }
            }
        })
        title_view.setLeftViewVisible(true)
        //标题
        title_view.setCenterViewContent(getResources().getString(R.string.shop))
        //分享按钮
        title_view.setImgRightOneResource(R.mipmap.share)
//        title_view.setImgRightOneOnclickListener()
    }

    fun initWebView(url: String?) {
        webView.setBackgroundColor(resources.getColor(R.color.white))
        webView.settings.defaultTextEncodingName = "UTF-8"
        webView.settings.javaScriptEnabled = true//支持js
        webView.settings.supportMultipleWindows()
        webView.settings.useWideViewPort = true // 扩大比例的缩放
        webView.settings.javaScriptCanOpenWindowsAutomatically = true//支持通过JS打开新窗口
        webView.settings.databaseEnabled = false// 数据库缓存
//        webView.getSettings().setAppCacheEnabled(true);// 打开缓存
//        webView.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);// 设置最大缓存
        webView.settings.setAllowContentAccess(true); // 是否可访问Content Provider的资源，默认值 true
        webView.settings.setAllowFileAccess(true);    // 是否可访问本地文件，默认值 true=
        webView.settings.setRenderPriority(WebSettings.RenderPriority.HIGH);// 提高渲染级别
        webView.settings.setLoadsImagesAutomatically(true);// 自动加载网络图片
        webView.settings.setDomStorageEnabled(true);// 打开dom storage缓存
        // 是否允许通过file url加载的Javascript读取本地文件，默认值 false
        webView.settings.setAllowFileAccessFromFileURLs(false);
        // 是否允许通过file url加载的Javascript读取全部资源(包括文件,http,https)，默认值 false
        webView.settings.setAllowUniversalAccessFromFileURLs(false);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webView.settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        // 自适应屏幕
        webView.settings.setLayoutAlgorithm(
                WebSettings.LayoutAlgorithm.SINGLE_COLUMN)
        webView.settings.setLoadWithOverviewMode(true)
        webView.loadUrl(url)
        webView.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                view.loadUrl(url)
                return true
            }

            // 以下是在WebViewClient中，截获并且修改其它的事件行为的代码。
            // 例子代码中截获的事件包括网页加载前，加载后，错误，重复提交，加载资源等。
            // 比如，发生网页错误的时候，可以用自己的错误信息取代浏览器插件的错误提示。
//            override fun onLoadResource(view: WebView, url: String) {
//                super.onLoadResource(view, url)
//            }
//
//            fun onReceivedError(view: WebView, errorCode: Int,
//                                description: String, failingUrl: String) {
//            }
//
//            fun onFormResubmission(view: WebView, dontResend: Message,
//                                   resend: Message) {
//            }
//
//            fun onPageStarted(view: WebView, url: String, favicon: Bitmap) {}
//
//            fun onPageFinished(view: WebView, url: String) {}
//
//            fun doUpdateVisitedHistory(view: WebView, url: String, isReload: Boolean) {
//                super.doUpdateVisitedHistory(view, url, isReload)
//            }
        }

        // WebChromeClient负责处理Javascript的对话框，网站图标，加载进度条等。下面的代码，在Activity上添加一个加载网页的进度条
        webView.webChromeClient = object : WebChromeClient() {
            override fun onProgressChanged(view: WebView, progress: Int) {
            }

            // 拦截输入框(原理同方式2)
            // 参数message:代表promt（）的内容（不是url）
            // 参数result:代表输入框的返回值
            override fun onJsPrompt(view: WebView, url: String, message: String, defaultValue: String, result: JsPromptResult): Boolean {
                // 根据协议的参数，判断是否是所需要的url(原理同方式2)
                // 一般根据scheme（协议格式） & authority（协议名）判断（前两个参数）
                //假定传入进来的 url = "js://webview?arg1=111&arg2=222"（同时也是约定好的需要拦截的）

                return super.onJsPrompt(view, url, message, defaultValue, result)
            }

            //通过alert()和confirm()拦截的原理相同，此处不作过多讲述

            // 拦截JS的警告框
            override fun onJsAlert(view: WebView, url: String, message: String, result: JsResult): Boolean {
                return super.onJsAlert(view, url, message, result)
            }

            // 拦截JS的确认框
            override fun onJsConfirm(view: WebView, url: String, message: String, result: JsResult): Boolean {
                return super.onJsConfirm(view, url, message, result)
            }

            // For Android < 3.0
            fun openFileChooser(valueCallback: ValueCallback<Uri>) {
                Logger.log("Android < 3.0")
            }

            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            override fun onPermissionRequest(request: PermissionRequest) {
                request.grant(request.resources)
            }

            // For Android  >= 3.0
            fun openFileChooser(valueCallback: ValueCallback<*>, acceptType: String) {
                Logger.log("Android  >= 3.0")
            }

            //For Android  >= 4.1
            fun openFileChooser(valueCallback: ValueCallback<Uri>, acceptType: String, capture: String) {
                Logger.log("Android  >= 4.1")
            }

            // For Android >= 5.0
            @SuppressLint("NewApi")
            override fun onShowFileChooser(webView: WebView, filePathCallback: ValueCallback<Array<Uri>>, fileChooserParams: FileChooserParams): Boolean {
                Logger.log("Android >= 5.0")
                return true
            }
        }

        //添加下面2行代码来忽略SSL验证
        val mWebviewclient = object : WebViewClient() {
            override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) {
                if (error.primaryError == android.net.http.SslError.SSL_INVALID) {// 校验过程遇到了bug
                    handler.proceed()
                } else {
                    handler.cancel()
                }
            }
        }

        // 特别注意：5.1以上默认禁止了https和http混用，以下方式是开启
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webView.settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
        }
        webView.webViewClient = mWebviewclient
    }

    fun isHomePage(): Boolean {
        return !webView.canGoBack()
    }

    fun webViewGoback() {
        webView.goBack()
    }

    fun canWebViewGoBack(): Boolean {
        return if (null != webView) {
            webView.canGoBack()
        } else {
            false
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        if (null != webView) {
            try {
                webView.stopLoading()
                webView.settings.javaScriptEnabled = false
                webView.clearHistory()
                webView.removeAllViews()
                webView.destroy()
            } catch (e: Exception) {
            }

        }
    }

    override fun onPause() {
        super.onPause()
        webView.onPause()
    }
}